perm filename DFTP.COR[NET,MRC] blob sn#242254 filedate 1976-10-14 generic text, type T, neo UTF8
-!DFTP.MAC←DFTP.OLD
-1,11
	TITLE	DFTP  Datacomputer File Transfer Program

IFNDEF F.TENX,F.TENX==-1	; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX

IFNDEF F.PCAP,F.PCAP==-1	; PRIVILEGED CAPABILITIES RESTRICTION

IFNDEF F.SAIL,F.SAIL==0		; -1 IF FOR SAIL
-27,27
IFL F.TENX,DEFINE THUD<.LOSE 1000>
IFE F.TENX,DEFINE THUD<HALT .-1>
IFG F.TENX,THUD==-1
-76
IFL F.TENX,DEFINE RELOC(ADDR)<LOC ADDR>



-216
; ((ITS))
IFL F.TENX,<
	SEARCH SITS
	LOC 150

;  Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO.  First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).

INIT:	MOVSI (JUMPA)
	HRR .JBSA##
	.BREAK 12,[400001,,]		;set start address
	SETZ 1,
	MOVE [1,,2]
	BLT 150
	.BREAK 16,100000		;return to DDT
	JRST DFTP

; I/O Channels

	TTI==1		; TTY I/O
	TTO==2
	DCI==3		; Datalanguage I/O
	DCO==4
	ICP==5		; ICP channel
	DDI==6		; Data I/O
	DDO==7
	LCI==10		; Local input
	LCO==11		; Local output
 
; ITS network definitions

%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11

DEFINE	TBIN(REG)
<	.IOT TTI,REG
	CAIG REG,"z"
	 CAIGE REG,"a"
	  CAIA
	   TRZ REG," ">

TBOUT==<.IOT TTO,>

DEFINE	TSOUT(STRING)
<	IRP STRING
<	PUSH STAK,R1
	MOVEI R1,STRING
	PUSHJ STAK,$STRIN
	POP STAK,R1
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$STRIN:	PUSH STAK,			; save AC 0
	HRLI R1,(POINT 7,)		; build a byte pointer to string
$STRI1:	ILDB R1				; get a character from string
	JUMPE $STRI2			; quit when done
	.IOT TTO,			; output the character
	JRST $STRI1			; and loop for more
$STRI2:	POP STAK,			; restore AC 0
	POPJ STAK,			; and return

DEFINE DCBIN(REG)
<	.IOT DCI,REG
	SKIPE FLAGDD
	 .IOT TTO,REG
>

DCBOUT==<.IOT DCO,>

DEFINE	DCSOUT(STRING)
<	IRP STRING
<	PUSH STAK,R1
	MOVEI R1,STRING
	PUSHJ STAK,$DSTRI
	POP STAK,R1
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$DSTRI:	PUSH STAK,			; save AC 0
	HRLI R1,(POINT 7,)		; build a byte pointer to string
$DSTR1:	ILDB R1				; get a character from string
	JUMPE $DSTR2			; quit when done
	.IOT DCO,			; output the character
	SKIPE FLAGDD			; show DATALANGUAGE?
	 .IOT TTO,
	JRST $DSTR1			; and loop for more
$DSTR2:	POP STAK,			; restore AC 0
	POPJ STAK,			; and return
>

-245
	CAIE REG,175
	 CAIN REG,176
	  MOVEI REG,33
-246:	CAILE	REG,"Z"+40
-260,260
	ILDB	REG,DCIBUF+1
	JUMPE REG,.-4>
-270,273
-281,281
IFG F.TENX,<
-331,334
; ***PROGRAM***

DFTP:
IFE F.TENX,JFCL				;CCL ENTRY POINT
IFGE F.TENX,RESET
-345
;	(((ITS)
	IFL F.TENX,<
		MOVEI UTIL,CMDM2
		.SUSET [.RXUNAME,,REG1]
		.CALL [	SETZ
			SIXBIT/OPEN/
			MOVEI
			[('DSK')]
			['.FILE.']
			['(DIR) ']
			SETZ REG1]
		 MOVEI UTIL,CMDM1		; NO ITS DIRECTORY
>
;	(((↑↑↑)))
-346:;	(((TOPS-10)))
-349,349
;		(!DISABLE!)
-353,353
	IFG F.TENX,<
-382,383

; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
-392,393
; (((SAIL)))
IFN F.SAIL,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
-480,480
IFG F.TENX,<
-481:CEXE:	MOVEI	REG1,37
-525
IFE F.SAIL,<
-535,535
>>
-577,577
-687,687
IFG F.TENX,<
-732,733
; (((TOPS-10+ITS)))
IFLE F.TENX,<
-734:P$2MP:	TSOUT	<CRLF>
-738,738
IFG F.TENX,<
-791,791
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST P$ICHR
-808,809
IFGE F.TENX,<			; have to use ' for passwords
	CAIN	IOREG,":"
	 JRST	P$IPON
>
-990,991
; (((ITS)))
IFL F.TENX,<
	CAIE IOREG," "
	 JRST P$IENN
	TLNN FLAG,PATHLR!PATHRL
	 JRST P$IENN
	JUMPN R12,[	TLNE FLAG,PATHRL
			 JRST P$ICHE	; GET -- second argument
			JRST P$IENN]
	TLNE FLAG,PATHLR
	 JRST P$ICHE		; PUT -- first argument
	JRST P$IENN
P$IENN:
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
-1232,1233
; (((TOPS-10+ITS)))
IFLE F.TENX,<
-1234:	HRRZI	IOREG,ABUF
-1239,1239
IFG F.TENX,<
-1248,1248
-1258,1258
	TSOUT	<[ASCIZ / ?? DATACOMPUTER initialization failure ??/],CRLF>
-1275,1276
; (((ITS)))
IFL F.TENX,<
	.SUSET [.RXUNAME,,UBUF1]
	SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
IFE F.SAIL,<
-1284
>
IFN F.SAIL,<
	GETPPN REG1,
	 JFCL
	HRLZM REG1,UBUF1
	SETZM UBUF1+1
>
>
; (((↑↑↑)))
; (((TOPS-10+ITS)))
IFLE F.TENX,<
-1285:	SETZM	<UBUF1+2>
-1301,1301
IFG F.TENX,<
-1451
; (((NOT ITS OR SAIL)))
IFGE F.TENX,<
IFE F.SAIL,<
-1462,1462
IFG F.TENX,<
-1479,1479
>
>
; (((↑↑↑)))
IFL F.TENX,SETZ IOREG,
IFN F.SAIL,SETZ IOREG,
-1732,1732
IFG F.TENX,<
-1733:	SETZM	FLAGCO
-1757,1758
; (((TOPS-10+ITS)))
IFLE F.TENX,<
-1763,1763
IFG F.TENX,<
-2060,2060
; (((TENEX+ITS)))
-2468,2468
	TSOUT	<[ASCIZ / ?? Fatal DATACOMPUTER error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
	.VALUE
	.BREAK 16,160000
>
; (((↑↑↑)))
-2475,2475
IFG F.TENX,<
-2476:	HALTF
-2481,2481
-2492,2492
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TAIN1
-2569,2569
IFL F.TENX,MOVEI TCIO,12
IFGE F.TENX,JRST TCICHR
-2734,2734
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TSICHR
-2805,2805
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TNICHR
-2806:	CAIN	IOREG,12
-2922,2926
; ***SYSTEM DEPENDENT ROUTINES***

; (((ITS)))
IFL F.TENX,<
-2930,3087
	.OPEN TTI,[.UAI,,'TTY']		; TTY input
	 THUD
	.CALL [	SETZ
		SIXBIT/TTYGET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVEM			; first set of character groups
		MOVEM			; second set of character groups
		SETZM REG1]		; TTYSTS variable
	 THUD
	TLO REG1,200			; disable **MORE** processing
	MOVE [030303,,030303]		; turn off echoing
	.CALL [	SETZ
		SIXBIT/TTYSET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVE			; first set of character groups
		MOVE			; second set of character groups
		SETZ REG1]		; TTYSTS variable
	 THUD
	.OPEN TTO,[.UAO,,'TTY']		; TTY output
	 THUD
	.CALL [	SETZ			; host number
		SIXBIT/NETHST/
		MOVEI -1
		MOVEM
		SETZM LHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UII!40050	; OPEN on gensymmed socket, 32 bits
		MOVEI ICP
		[('NET')]		; network device
		[-1]			; initial local socket is gensymmed
		MOVEI DCSOKT		; initial foreign socket(DATACOMPUTER)
		SETZI DCHOST]		; foreign host(CCA)
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI ICP
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	MOVE REG1,[ICP,,RCHBLK]
	.RCHST REG1,			; get status of network channel
	HRRE REG1,RCHBLK+4		; get status of network
	JUMPL REG1,NETDED		; network dead if .LE. 0
	CAIN REG1,%NSCLI		; CLS w/ input?
	 JRST ICPWIN
	CAIN REG1,%NSINP		; input available?
	 CAIN REG1,%NSOPN		; connection open?
	  JRST ICPWIN
	JUMPN REG1,[THUD]		; any other condition is lossage
ICPCLS:	TSOUT <[ASCIZ/Cannot establish network connection/]>
	.BREAK 16,160000
NETDED:	TSOUT <[ASCIZ/ARPAnet is down/]>
	.BREAK 16,160000
ICPWIN:	MOVE REG1,RCHBLK+1		; get gensymmed local socket
	ADDI REG1,2			; receive
	MOVEM REG1,LCLRCV
	ADDI REG1,1			; transmit
	MOVEM REG1,LCLTRN
	.IOT ICP,REG1			; get foreign place's socket
	.CLOSE ICP,			; free up ICP socket right away
	MOVEM REG1,FORRCV		; receive
	ADDI REG1,1			; socket to me!
	MOVEM REG1,FORTRN
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAI
		MOVEI DCI		; DATACOMPUTER input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAO
		MOVEI DCO		; DATACOMPUTER output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCI
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCO
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	MOVEI REG1,2			; offset for data sockets
	ADDM REG1,LCLRCV
	ADDM REG1,LCLTRN
	ADDM REG1,FORRCV
	ADDM REG1,FORTRN
-3092,3112
QUIT:	.IOT DCO,["Z"-100]		; SEND QUIT
QUIT1:	DCBIN <IOREG>
	JUMPGE IOREG,QUIT1
	.CLOSE DCI,
	.CLOSE DCO,
	.BREAK 16,160000
-3117,3135
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI DDI		; DATACOMPUTER data input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDI
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	RETURN SKIP,1
-3141,3159
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI DDO		; DATACOMPUTER data output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDO
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	RETURN SKIP,1
-3160:	ENDR
-3165,3171
	.CLOSE DDI,
	.CLOSE DDO,
-3175,3181
;
NETNI:	BEGINR
	MOVE UTIL,LCLRCV
-3185,3298
;
NETNO:	BEGINR
	MOVE UTIL,LCLTRN
	ENDR
-3303,3315
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		LCLDEV
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOI1
	RETURN SKIP,1
LOCOI1:	TSOUT <[ASCIZ/ (Local file not found.)/],CRLF>
-3320,3344
LOCOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI LCO
		LCLDEV
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOO1
	RETURN SKIP,1
LOCOO1:	TSOUT <[ASCIZ/ ?? Local file creation failure ??/],CRLF>
-3345:	ENDR
-3350,3363
	.CLOSE LCI,
	.CLOSE LCO,
	ENDR

; LOCS -- LOCAL FILE (SIZE)
;
LOCS:	BEGINR
	.CALL [	SETZ
		SIXBIT/FILLEN/
		MOVEI LCI
		SETZM UTIL]
	 SETZ UTIL,			; it should not crap out
-3368,3427
LOCDG:	BEGINR <BPREG,UTIL>
	MOVE BPREG,[POINT 7,GBUF1]
	ILDB UTIL,BPREG
	JUMPE UTIL,RETN(0)
	CAIN UTIL," "
	 MOVEI UTIL,"0"
	MOVEI REG1,-"0"(UTIL)
	IMULI REG1,↑D10
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	ILDB UTIL,BPREG
	CAIE UTIL,"-"
	 RETURN
	MOVE REG2,[POINT 7,REG3]
	SETZ REG3,
	ILDB UTIL,BPREG
	IDPB UTIL,REG2
	ILDB UTIL,BPREG
	IDPB UTIL,REG2
	ILDB UTIL,BPREG
	IDPB UTIL,REG2
	MOVEI REG2,↑D12
	CAMN REG3,LOCDM-1(REG2)
	 JRST .+3
	  SOJGE REG2,.-2
	  RETURN
	ILDB UTIL,BPREG
	CAIE UTIL,"-"
	 RETURN
	ILDB UTIL,BPREG
	MOVEI REG3,-"0"(UTIL)
	IMULI REG3,↑D10
	ILDB UTIL,BPREG
	ADDI REG3,-"0"(UTIL)
	LSH REG3,↑D27
	LSH REG2,↑D23
	ADD REG3,REG2
	MOVS REG1,REG1
	ADD REG3,REG1
	ILDB UTIL,BPREG
	CAIE UTIL," "
	 RETURN
	ILDB UTIL,BPREG
	MOVEI REG1,-"0"(UTIL)
	IMULI REG1,↑D10
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	IMULI REG1,6
	ILDB UTIL,BPREG
	CAIE UTIL,":"
	 RETURN
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	IMULI REG1,↑D10
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	IMULI REG1,6
	ILDB UTIL,BPREG
	JUMPE UTIL,LOCDG1		; ALLOW FOR TOPS-10SES
	CAIE UTIL,":"
	 RETURN
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	IMULI REG1,↑D10
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	LSH REG1,1
	CAIA
LOCDG1:	 IMULI REG1,↑D20
	ADDI REG3,(REG1)
	.CALL [	SETZ
		SIXBIT/SFDATE/
		MOVEI LCO
		SETZ REG3]
	 JFCL
-3433,3484
	.CALL [	SETZ
		SIXBIT/RFDATE/
		MOVEI LCI
		SETZM REG2]
	 MOVSI REG2,124201		; ASSUME APRIL 1, 1984
	MOVE REG1,[POINT 7,GBUF1]
	LDB REG3,[POINT 5,REG2,17]	; DAY
	IDIVI REG3,↑D10
	ADDI REG3,"0"
	CAIN REG3,"0"
	 MOVEI REG3," "
	ADDI REG4,"0"
	IDPB REG3,REG1
	IDPB REG4,REG1
	MOVEI REG3,"-"
	IDPB REG3,REG1
	LDB REG3,[POINT 4,REG2,12]	; MONTH
	HRRI REG3,LOCDM-1(REG3)
	HRLI REG3,(POINT 7,)
	SCOPY (REG3,REG1)
	MOVEI REG3,"-"
	IDPB REG3,REG1
	LDB REG3,[POINT 7,REG2,8]	; YEAR
	IDIVI REG3,↑D10
	ADDI REG3,"0"
	ADDI REG4,"0"
	IDPB REG3,REG1
	IDPB REG4,REG1
	MOVEI REG3," "
	IDPB REG3,REG1
	LDB REG2,[POINT 17,REG2,34]	; TIME IN SECONDS
	IDIVI REG2,↑D3600
	MOVEI REG4,(REG3)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,REG1
	IDPB REG3,REG1
	MOVEI REG2,":"
	IDPB REG2,REG1
	MOVEI REG2,(REG4)
	IDIVI REG2,↑D60
	MOVEI REG4,(REG3)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,REG1
	IDPB REG3,REG1
	MOVEI REG2,":"
	IDPB REG2,REG1
	MOVEI REG2,(REG4)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,REG1
	IDPB REG3,REG1
	SETZ REG2,
	IDPB REG2,REG1
	ENDR				; return
-3488,3499
LOCDM:	ASCII/JAN/
	ASCII/FEB/
	ASCII/MAR/
	ASCII/APR/
	ASCII/MAY/
	ASCII/JUN/
	ASCII/JUL/
	ASCII/AUG/
	ASCII/SEP/
	ASCII/OCT/
	ASCII/NOV/
	ASCII/DEC/
-3504,3612
LUTFN:	BEGINR <IOREG>
	MOVSI REG1,'DSK'		; set defaults
	MOVEM REG1,LCLDEV
	.SUSET [.RSNAME,,LCLSNM]
	SETZM LCLFN1			; < prevent assembly error
	MOVSI REG1,'>  '
	MOVEM REG1,LCLFN2
	HRLI IOREG,(POINT 7,)
LUTFN1:	CALLR LUTWRD			; get a SIXBIT word
	JUMPE REG1,LUTF1A
	CAIN REG2,":"			; device
	 JRST [	MOVEM REG1,LCLDEV
		JRST LUTFN1]
	CAIN REG2,";"			; SNAME
	 JRST [	MOVEM REG1,LCLSNM
		JRST LUTFN1]
	SKIPN LCLFN1			; FN1
	 JRST [	MOVEM REG1,LCLFN1
		JRST LUTF1A]
	MOVEM REG1,LCLFN2		; FN2
LUTF1A:	JUMPN REG2,LUTFN1
	ENDR

; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN REG1, DELIMITER IN REG2
;
LUTWRD:	BEGINR <BPREG>
	SETZ REG1,			; initialize word, word pointer
	MOVE BPREG,[POINT 6,REG1]
LUTWR1:	ILDB REG2,IOREG			; get a character from buffer
	CAIE REG2,":"
	 CAIN REG2,";"
	  JRST RETN(0)
	CAIN REG2," "
	 JRST RETN(0)
	JUMPE REG2,RETN(0)
	SUBI REG2," "			; SIXBITify from ASCII
	TRNN REG1,77			; and save in word until word filled
	 IDPB REG2,BPREG
	JRST LUTWR1
-3613:	ENDR
-3617,3657
MOVLN:	BEGINR <UTIL>
	CALLR LOCS			; get length of file
	MOVEM UTIL,MOVSPA
	SETZM MOVSUM
	.RDTIM REG1,
	IDIVI REG1,↑D30
	MOVEM REG1,MOVTIM
MOVLN1:	MOVE REG1,[-2000,,IOBUFR]
	.IOT LCI,REG1			; read 1K from local file
	JUMPL REG1,MOVLN2		; hit EOF here
	MOVE REG1,[-2000,,IOBUFR]
	.IOT DDO,REG1
	MOVSI REG1,-2000		; compute checksum
	MOVE REG2,IOBUFR(REG1)
	ADDM REG2,MOVSUM
	AOBJN REG1,.-2
	JRST MOVLN1
MOVLN2:	MOVEI REG1,-IOBUFR(REG1)	; get # of words transferred
	JUMPE REG1,MOVLN3
	MOVNS REG1
	HRLZS REG1
	PUSH STAK,REG1
	HRRI REG1,IOBUFR
	.IOT DDO,REG1
	POP STAK,REG1
	MOVE REG2,IOBUFR(REG1)
	ADDM REG2,MOVSUM
	AOBJN REG1,.-2
MOVLN3:	.RDTIM REG1,
	IDIVI REG1,↑D30
	SUBM REG1,MOVTIM
-3663,3817
	SETZM MOVSPA
	SETZM MOVSUM
	.RDTIM REG1,
	IDIVI REG1,↑D30
	MOVEM REG1,MOVTIM
MOVNL1:	MOVE REG1,[-2000,,IOBUFR]
	.IOT DDI,REG1			; read 1K from DATACOMPUTER
	JUMPL REG1,MOVNL2		; hit EOF here
	MOVEI REG1,2000
	ADDM REG1,MOVSPA
	MOVE REG1,[-2000,,IOBUFR]
	.IOT LCO,REG1
	MOVSI REG1,-2000		; compute checksum
	MOVE REG2,IOBUFR(REG1)
	ADDM REG2,MOVSUM
	AOBJN REG1,.-2
	JRST MOVNL1
MOVNL2:	MOVEI REG1,-IOBUFR(REG1)	; get # of words transferred
	JUMPE REG1,MOVLN3
	ADDM REG1,MOVSPA
	MOVNS REG1
	HRLZS REG1
	PUSH STAK,REG1
	HRRI REG1,IOBUFR
	.IOT LCO,REG1
	POP STAK,REG1
	MOVE REG2,IOBUFR(REG1)
	ADDM REG2,MOVSUM
	AOBJN REG1,.-2
MOVNL3:	.RDTIM REG1,
	IDIVI REG1,↑D30
	SUBM REG1,MOVTIM
	ENDR

; MOVV -- VERIFY (WORD-BY-WORD COMPARE)
;
MOVV:	BEGINR <IOREG,UTIL,FLAG>
	SETZB UTIL,FLAG
	SETZM MOVSUM
MOVV0:	MOVE REG1,[-1000,,IOBUFR]
	.IOT DDI,REG1
	MOVE REG2,[-1000,,IOBUFR+1000]
	.IOT LCI,REG2
	HLLZ REG3,REG1
	HLLZ REG4,REG2
MOVV1:	MOVEI REG1,-IOBUFR(REG1)
	JUMPE REG1,MOVV2
	SETZ REG2,
MOVV01:	CAIN FLAG,0
	 ADDI UTIL,1
	MOVE IOREG,IOBUFR(REG2)
	ADDM IOREG,MOVSUM
	CAME IOREG,IOBUFR+1000(REG2)
	 ADDI FLAG,1
	ADDI REG2,1
	SOJG REG1,MOVV01
	CAMN REG3,REG4			; file sizes match?
	 JRST MOVV0
	CAML REG3,REG4			; DATACOMPUTER file smaller?
	 JRST MOVV4
	JRST MOVV5			; no
MOVV2:	JUMPN FLAG,MOVV3
	TSOUT <[ASCIZ / [OK]/],CRLF>
	RETURN
MOVV3:	CAIE FLAG,1
	 JRST MOVV3A
	TSOUT <[ASCIZ / (There is one different word at /]>
	JRST MOVV03
MOVV3A:	TSOUT <[ASCIZ / (There are /]>
	TNOUT <FLAG>
	TSOUT <[ASCIZ / different words.  The first difference is at /]>
MOVV03:	TNOUT <UTIL>
	TSOUT <[ASCIZ /.)/],CRLF>
	RETURN
MOVV4:	MOVE REG1,[-1000,,IOBUFR]
	.IOT DDI,REG1		; it gets upset if you don't read everything
	MOVEI REG2,-IOBUFR(REG1)
	JUMPE REG2,MOVV04
	MOVE IOREG,IOBUFR-1(REG2)
	ADDM IOREG,MOVSUM
	SOJG REG2,.-2
	JUMPL REG1,MOVV04
	JRST MOVV4
MOVV04:	TSOUT <[ASCIZ / (The datacomputer file is larger than the local file.)/],CRLF>
	RETURN
MOVV5:	TSOUT <[ASCIZ / (The local file is larger than the datacomputer file.)/],CRLF>
	ENDR

-3821,3822
; (((TOPS-10)))
IFE F.TENX,<
-3826,3843
	MOVE	0,[SIXBIT/DFTP/]
	SETNAM	0,
	OPEN	0,[	200	; TURN OFF TTY ECHOING
			SIXBIT	/TTY/
			0]
	 THUD
-3847,3924
; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IOREG,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IOREG,LINP		; LISTEN ON INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	.+2
	JRST	ICPICP
	MOVE	IOREG,DCIBLK+.IBERR
	CAIE	IOREG,.IESKT
	 JRST	ICPEIL
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	REG3,
	SETZ	FLAG,
ICPRDV:	MOVE	IOREG,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IOREG,WRKBLK+.IBDEV
	MOVEI	REG1,(REG3)
	IDIVI	REG1,10
	JUMPE	REG1,ICPRD1
	ADDI	REG1,20
	ADDI	REG2,20
	DPB	REG1,[140600,,WRKBLK+.IBDEV]
	DPB	REG2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	REG2,20
	DPB	REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IOREG,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD3
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	REG2,(REG1)
	 JRST	ICPRD3
	MOVE	IOREG,WRKBLK+.IBLCL
	CAMN	IOREG,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
	SUBI	IOREG,2
	CAMN	IOREG,UTIL		; INPUT DATA SOCKET
	 JRST	ICPCLI
ICPRD3:	MOVEI	IOREG,1			; OUTPUT DATA SOCKET
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	HRRZ	IOREG,WRKBLK+.IBHST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD4
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT
	CAIE	REG2,(REG1)
	 JRST	ICPRD4
	MOVE	IOREG,WRKBLK+.IBLCL
	SUBI	IOREG,3
	CAMN	IOREG,UTIL
	 JRST	ICPCLO
ICPRD4:	ADDI	REG3,1
	CAIGE	REG3,(REG4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	TTCALL	3,[ASCIZ / (Connections in use.)/]
	EXIT
ICPCLS:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IOREG,1
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPCLI:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / (Retrieve interrupted:  connection closed.)
/]
	JRST	ICPRDV
ICPCLO:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / (Store interrupted:  connection closed.)
/]
	JRST	ICPRDV
ICPICP:	MOVE	IOREG,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IOREG,DCCHAS+1
	MOVE	IOREG,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IOREG,OICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,ICCHAS+1
	OPEN	DCCHAN,ICCHAS		; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 JRST	.+2
	JRST	ICPET
	MOVE	IOREG,ICPBUF+1
	MOVE	IOREG,1(IOREG)		; GET THE SOCKET NUMBER
	LSH	IOREG,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IOREG,DCOBLK+.IBRMT
	AOJ	IOREG,
	MOVEM	IOREG,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,OINP		; OPEN INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IOREG,OOUT		; OPEN OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IOREG,WRKBLK+.IBHST
	MOVEM	IOREG,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

ICPBEG:	; Tovar says this is the right thing to do - MRC
	PJOB REG2,		; GET JOB #
	MOVSS REG4,REG2		; RECEIVE SOCKET
	ADDI REG4,1		; TRANSMIT SOCKET
	MOVEI REG1,13		; SAIL'S HOST ADDRESS NUMBER
	MOVEM REG1,LHOST	; SAVE IT AWAY
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONECB
	MOVEM REG2,CONECB+LSLOC
	MOVEI REG3,DCHOST
	MOVEM REG3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI REG3,40
	MOVEM REG3,CONECB+BSLOC
	MOVEI REG3,DCSOKT
	MOVEM REG3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE REG3,FRS
	LSH REG3,-4
	MOVEM REG3,FRS
	ADDI REG3,1
	MOVEM REG3,FSS#
	ADDI REG2,2
	MOVEM REG2,LRS#
	ADDI REG4,2
	MOVEM REG4,LSS#
	MOVE REG1,CONECB+LSLOC
	MOVEM REG1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 5,24,0,12,0
		]		; TIME OUT CLS, RFNM, AND RFC
	MOVEI REG1,↑D8
	DPB REG1,[POINT 6,DCIBUF+1,11]
	DPB REG1,[POINT 6,DCOBUF+1,11]
	MOVEM REG2,CONECB+LSLOC
	MOVEI REG3,DCHOST
	MOVEM REG3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI REG3,↑D8
	MOVEM REG3,CONECB+BSLOC
	MOVE REG3,FSS
	MOVEM REG3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TRNN REG1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI REG3,↑D8
	MOVEM REG3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TRNN REG1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI REG3,4
	MOVEM REG3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TLC REG1,300000
	TLCN REG1,300000
	 TLNE REG1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE REG1,CONECB+STLOC
	TLC REG1,300000
	TLCN REG1,300000
	 TLNE REG1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	RETURN

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/? Cannot establish network connection/]
	EXIT
>
; (((↑↑↑)))
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI	IOREG,"Z"-100
	IDPB	IOREG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+1
QUIT01:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT02
	SKIPE	FLAGDD
	 CALLR	NUTDD
	JRST	QUIT01
QUIT02:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT03:	IFE F.SAIL,<
	MOVE	IOREG,COUT		; CLOSE OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
>
QUIT04:	IFE F.SAIL,<
	MOVE	IOREG,CINP		; CLOSE INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
>
	EXIT
-3925:
-3929,3955
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOI2
	SETZM CONECB
	MOVE REG1,LRS
	ADDI REG1,2
	MOVEM REG1,CONECB+LSLOC
	MOVEI REG1,DCHOST
	MOVEM REG1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI REG1,↑D36
	MOVEM REG1,CONECB+BSLOC
	MOVE REG1,FSS
	ADDI REG1,2
	MOVEM REG1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOI2
	RETURN SKIP,1
>
IFE F.SAIL,<
	SETZM	DCDBLK+.IBDEV
	MOVEI	REG1,104
	MOVEM	REG1,DCDBLK+.IBLCL
	MOVE	REG1,DCIBLK+.IBRMT
	ADDI	REG1,2
	MOVEM	REG1,DCDBLK+.IBRMT
	MOVE	REG1,ODAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
	MOVE	REG1,DCDBLK+.IBDEV
	MOVEM	REG1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
>
NETOI2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
-3961,3987
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOO2
	SETZM CONECB
	MOVE REG1,LSS
	ADDI REG1,2
	MOVEM REG1,CONECB+LSLOC
	MOVEI REG1,DCHOST
	MOVEM REG1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI REG1,↑D36
	MOVEM REG1,CONECB+BSLOC
	MOVE REG1,FRS
	ADDI REG1,2
	MOVEM REG1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOO2
	RETURN SKIP,1
>
IFE F.SAIL,<
	SETZM	DCDBLK+.IBDEV
	MOVEI	REG1,105
	MOVEM	REG1,DCDBLK+.IBLCL
	MOVE	REG1,DCOBLK+.IBRMT
	ADDI	REG1,2
	MOVEM	REG1,DCDBLK+.IBRMT
	MOVE	REG1,ODAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
	MOVE	REG1,DCDBLK+.IBDEV
	MOVEM	REG1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
>
NETOO2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
-3993,3999
	RELEAS	DDCHAN,
IFE F.SAIL,<
	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETC1
	RETURN
NETC1:	TTCALL	3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
-4006,4009
IFN F.SAIL,<MOVE UTIL,LRS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,104>
-4016,4019
IFN F.SAIL,<MOVE UTIL,LSS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,105>
	ENDR

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 JRST	.+2
	JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: REG1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IOREG,BPREG>
	SKIPE FLAGDD
	 OUTSTR (REG1)
	MOVEI	BPREG,(REG1)
	HRLI	BPREG,440700
NUTMOL:	ILDB	IOREG,BPREG
	JUMPE	IOREG,RETN(0)
	SKIPE	DCOBUF+2
	 JRST	NUTMOB
NUTMOO:	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
NUTMOB:	SOS	DCOBUF+2
	IDPB	IOREG,DCOBUF+1
	JRST	NUTMOL
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD:	BEGINR	<IOREG,UTIL>
	MOVE REG1,DCIBUF+1
	MOVE UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IOREG,REG1
	JUMPE	IOREG,NUTDDL
	TTCALL	1,IOREG
	JRST	NUTDDL
-4020:	ENDR
-4024,4041
IFE F.SAIL,<
ICPERD:	TTCALL	3,[ASCIZ / ?? Restart failure ??/]
	EXIT
ICPEIL:	TTCALL	3,[ASCIZ / ?? Input socket listen failure ??/]
	EXIT
ICPEOL:	TTCALL	3,[ASCIZ / ?? Output socket listen failure ??/]
	JRST	QUIT04
ICPET:	TTCALL	3,[ASCIZ / ?? ICP failure (transfer) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT03
ICPEF:	TTCALL	3,[ASCIZ / ?? ICP failure (file control) ??/]
	JRST	ICPEZ
ICPEC:	TTCALL	3,[ASCIZ / The datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 TTCALL	3,[ASCIZ / (rejecting)/]
	CAIN	0,.IEDWN
	 TTCALL	3,[ASCIZ / (down)/]
	CAIN	0,.IETIM
	 TTCALL	3,[ASCIZ / (timeout)/]
	TTCALL	3,[ASCIZ /.
/]
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT03
	JRST	QUIT03
NETEIC:	TTCALL	3,[ASCIZ / ?? Input failure (connection) ??/]
	EXIT
NETEOC:	TTCALL	3,[ASCIZ / ?? Output failure (connection) ??/]
	JRST	QUIT04
NETECF:	TTCALL	3,[ASCIZ / ?? File control failure ??/]
	JRST	QUIT03
>
NETEIT:	TTCALL	3,[ASCIZ / ?? Input failure (transfer) ??/]
	JRST	QUIT
NETEOT:	TTCALL	3,[ASCIZ / ?? Output failure (transfer) ??/]
	JRST	QUIT

IFE F.SAIL,<
OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
ODAT:	001000+.IUCON,,DCDBLK	; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT:	.IUCLS,,DCDBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK
>

;(((SAIL)))
IFN F.SAIL,< 
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME

CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE REG1,STTBLK+1
	IOR REG1,STTBLK+2
	STATO DCCHAN,ERRBTS
	TLNN REG1,060000
	 RETURN SKIP,1
	ENDR
>
;(((↑↑↑↑)))
-4046,4064
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOI1
	LOOKUP	LFCHAN,LFILE	; PREPARE FILE FOR INPUT
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	TTCALL	3,[ASCIZ / ?? Local channel OPEN failure ??
/]
	RELEAS	LFCHAN,
	RETURN
LOCOI2:	TTCALL	3,[ASCIZ / (Local file not found.)
/]
	RELEAS	LFCHAN,
-4069,4084
LOCOO:	BEGINR	<IOREG,<IOREG+1>>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS
	 JRST	LOCOO2
	MOVE	IOREG,<LFILE+1>
	MOVE	<IOREG+1>,<LFILE+2>
	LOOKUP	LFCHAN,LFILE
	 JRST	LOCOO1
	TAIN	<[ASCIZ / [Old Local File][Confirm]/]>
	 JRST	.+3
	 JRST	.+2
	JRST	LOCOO1
	RELEAS	LFCHAN,
	RETURN
LOCOO1:	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOO2
	MOVEM	IOREG,<LFILE+1>
	MOVEM	<IOREG+1>,<LFILE+2>
	ENTER	LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
	 JRST	LOCOO2
	RETURN	SKIP,1
LOCOO2:	TTCALL	3,[ASCIZ / ?? Local file creation failure ??
/]
	RELEAS	LFCHAN,
-4090,4096
	RELEAS	LFCHAN,
-4103,4159
	SKIPL	LFILE+3
	 JRST	LOCS1
	HLRO	UTIL,LFILE+3	; SIZE IN WORDS
	MOVN	UTIL,UTIL
	RETURN
LOCS1:	HLRZ	UTIL,LFILE+3	; SIZE IN BLOCKS
	IMULI	UTIL,SIZBLK
	ENDR

; LOCDG -- LOCAL FILE CREATION DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG:	BEGINR	<BPREG,UTIL>
	MOVE	BPREG,[440700,,GBUF1]
	ILDB	UTIL,BPREG
	JUMPE	UTIL,RETN(0)
	CAIN	UTIL," "
	 MOVEI	UTIL,"0"
	MOVEI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	ILDB	UTIL,BPREG
	CAIE	UTIL,"-"
	 RETURN
	MOVE	REG2,[440700,,REG3]
	SETZ	REG3,
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	MOVEI	REG2,↑D11
	CAMN	REG3,LOCDM(REG2)
	 JRST	.+3
	SOJGE	REG2,.-2
	RETURN
	ILDB	UTIL,BPREG
	CAIE	UTIL,"-"
	 RETURN
	ILDB	UTIL,BPREG
	MOVEI	REG3,-"0"(UTIL)
	IMULI	REG3,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG3,-"0"(UTIL)
	SUBI	REG3,↑D64
	IMULI	REG3,↑D12
	ADDI	REG3,(REG2)
	IMULI	REG3,↑D31
	ADDI	REG3,-1(REG1)
	ILDB	UTIL,BPREG
	CAIE	UTIL," "
	 RETURN
	ILDB	UTIL,BPREG
	MOVEI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	IMULI	REG1,6
	ILDB	UTIL,BPREG
	CAIE	UTIL,":"
	 RETURN
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	DPB	REG3,[001400,,LFILE+2]
	LSH	REG3,-14
	DPB	REG3,[170300,,LFILE+1]
	DPB	REG1,[141300,,LFILE+2]
	ENDR

; LOCDP -- LOCAL FILE CREATION DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP:	BEGINR
	MOVE	REG1,[440700,,GBUF1]
	LDB	REG2,[001400,,LFILE+2] ; CREATION DATE
	LDB	REG3,[170300,,LFILE+1]
	LSH	REG3,14
	IORI	REG2,(REG3)
	IDIVI	REG2,↑D31
	MOVEI	REG4,(REG2)
	MOVEI	REG2,1(REG3)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	CAIN	REG2,"0"
	 MOVEI	REG2," "
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2,"-"
	IDPB	REG2,REG1
	MOVEI	REG2,(REG4)
	IDIVI	REG2,↑D12
	MOVEI	REG4,(REG2)
	HRRI	REG2,LOCDM(REG3)
	HRLI	REG2,440700
	SCOPY	(REG2,REG1)
	MOVEI	REG2,"-"
	IDPB	REG2,REG1
	MOVEI	REG2,↑D64(REG4)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2," "
	IDPB	REG2,REG1
	LDB	REG2,[141300,,LFILE+2] ; CREATION TIME
	IDIVI	REG2,↑D60
	MOVEI	REG4,(REG3)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2,":"
	IDPB	REG2,REG1
	MOVEI	REG2,(REG4)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	SETZ	REG2,
	IDPB	REG2,REG1
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LOCDM:	ASCII	/JAN/
	ASCII	/FEB/
	ASCII	/MAR/
	ASCII	/APR/
	ASCII	/MAY/
	ASCII	/JUN/
	ASCII	/JUL/
	ASCII	/AUG/
	ASCII	/SEP/
	ASCII	/OCT/
	ASCII	/NOV/
	ASCII	/DEC/

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IOREG,BPREG,UTIL>
	HRRI	BPREG,(IOREG)
	HRLI	BPREG,440700
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
	SETZM	LFILE+3
	MOVEI	REG1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	REG2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IOREG,BPREG
	JUMPE	IOREG,RETN(0)
	CAIN	IOREG,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IOREG,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IOREG,77	;   AND REMOVAL OF HIGH BITS
	XCT	(REG1)		; EXECUTE THE PROPER ROTATE
	IORM	IOREG,(REG2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	REG1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	REG2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	REG1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	REG2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IOREG,-6	; HIGH ORDER
	ROT	IOREG,-14
	ROT	IOREG,22
	ROT	IOREG,14
	ROT	IOREG,6
	ROT	IOREG,0		; LOW ORDER
	ENDR

; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
IFE F.SAIL,<
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
	MOVE	REG1,LUTDSP
	SKIPN	(REG1)
	 JRST	LUTDSI
LUTDS1:	MOVNI	REG2,2
	ADDM	REG2,LDIBUF+2
	SKIPGE	LDIBUF+2
	 JRST	LUTDSI
	MOVE	REG3,[440700,,ABUF]
	HRLI	REG1,440600
	MOVEI	REG2,6
LUTDS2:	ILDB	REG4,REG1
	JUMPE	REG4,LUTDS3
	ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,LUTDS2
LUTDS3:	ADDI	REG1,1
	LDB	REG4,[222200,,(REG1)]
	JUMPE	REG4,LUTDS5
	MOVEI	REG4,"."
	IDPB	REG4,REG3
	HRLI	REG1,440600
	MOVEI	REG2,3
LUTDS4:	ILDB	REG4,REG1
	JUMPE	REG4,LUTDS5
	ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,LUTDS4
LUTDS5:	SETZ	REG4,
	IDPB	REG4,REG3
	ADDI	REG1,1
	HRRZM	REG1,LUTDSP
	RETURN	SKIP,1
LUTDSS:	RELEAS	LDCHAN,
	GETPPN	REG1,
	MOVEM	REG1,LDIR
	MOVE	REG1,[SIXBIT/UFD/]
	MOVEM	REG1,LDIR+1
	SETZM	LDIR+2
	MOVE	REG1,[1,,1]
	MOVEM	REG1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	IN	LDCHAN,
	 JRST	.+2
	JRST	LUTDSE
	HRRZ	REG1,LDIBUF
	ADDI	REG1,2
	SKIPE	(REG1)
	 JRST	LUTDS1
	TTCALL	3,[ASCIZ / (No local files.)
/]
	RELEAS	LDCHAN,
	RETURN
LUTDSI:	IN	LDCHAN,
	 JRST	.+2
	JRST	LUTDSD
	HRRZ	REG1,LDIBUF
	ADDI	REG1,2
	SKIPE	(REG1)
	 JRST	LUTDS1
	RELEAS	LDCHAN,
	RETURN
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 TTCALL	3,[ASCIZ / ?? Local directory failure ??
/]
	RELEAS	LDCHAN,
	ENDR
>
-4160:
-4163,4163
MOVLN:	BEGINR	<UTIL>
-4167,4201
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVEM	REG1,MOVTIM
MOVLN1:	SOSG LFIBUF+2		;TRADITIONAL WAY, SINCE HACKING
	 IN LFCHAN,		;BUFFERS IS ASKING FOR TROUBLE!!
	  CAIA
	   JRST MOVLN2
	ILDB REG1,LFIBUF+1
	ADDM REG1,MOVSUM
	SOSG DDOBUF+2
	 OUT DDCHAN,
	  CAIA
	  THUD
	IDPB REG1,DDOBUF+1
	JRST	MOVLN1
MOVLN2:	STATO	LFCHAN,20000
	 THUD
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVE	REG2,MOVTIM
	CAMGE	REG1,REG2
	 ADDI	REG1,<↑D24*↑D60*↑D60>
	SUB	REG1,REG2
	MOVEM	REG1,MOVTIM
-4206,4237
MOVNL:	BEGINR
	SETZM	MOVSUM
	SETZM	MOVSPA
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVEM	REG1,MOVTIM
MOVNL1:	SOSG DDIBUF+2
	 IN DDCHAN,
	  CAIA
	   JRST MOVNL2
	ILDB REG1,DDIBUF+1
	AOS MOVSPA
	ADDM REG1,MOVSUM
	SOSG LFOBUF+2
	 OUT LFCHAN,
	  CAIA
	   THUD
	IDPB REG1,LFOBUF+1
	JRST MOVNL1
MOVNL2:	STATO DDCHAN,20000
	 THUD
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVE	REG2,MOVTIM
	CAMGE	REG1,REG2
	 ADDI	REG1,<↑D24*↑D60*↑D60>
	SUB	REG1,REG2
	MOVEM	REG1,MOVTIM
-4245,4348
	SETZM	MOVSUM
	IN	DDCHAN,
	 JRST	.+2
	THUD
	IN	LFCHAN,
	 JRST	.+2
	JRST	MOVV4
MOVV1:	CAIN	FLAG,0
	 ADDI	UTIL,1
	SKIPLE	LFIBUF+2
	 JRST	.+4
	IN	LFCHAN,
	 JRST	.+2
	JRST	MOVV2
	SOS	LFIBUF+2
	AOS	LFIBUF+1
	MOVE	IOREG,@<LFIBUF+1>
	SKIPLE	DDIBUF+2
	 JRST	.+4
	IN	DDCHAN,
	 JRST	.+2
	JRST	MOVV5
	SOS	DDIBUF+2
	AOS	DDIBUF+1
	MOVE	REG1,@<DDIBUF+1>
	ADDM	REG1,MOVSUM
	CAMN	IOREG,REG1
	 JRST	MOVV1
	AOJA	FLAG,MOVV1
MOVV2:	STATO	LFCHAN,20000
	 THUD
	SKIPLE	DDIBUF+2
	 JRST	MOVV4
	IN	DDCHAN,
	 JRST	MOVV4
	STATO	DDCHAN,20000
	 THUD
	JUMPN	FLAG,MOVV3
	TTCALL	3,[ASCIZ / [OK]
/]
	RETURN
MOVV3:	CAIE	FLAG,1
	 JRST	.+3
	TTCALL	3,[ASCIZ / (There is one different word at /]
	JRST	MOVV03
	TTCALL	3,[ASCIZ / (There are /]
	TNOUT	<FLAG>
	TTCALL	3,[ASCIZ / different words, with the first difference at /]
MOVV03:	TNOUT	<UTIL>
	TTCALL	3,[ASCIZ /.)
/]
	RETURN
MOVV4:	SKIPLE	DDIBUF+2
	 JRST	.+4
	IN	DDCHAN,
	 JRST	.+2
	JRST	MOVV04
	SOS	DDIBUF+2
	AOS	DDIBUF+1
	MOVE	REG1,@<DDIBUF+1>
	ADDM	REG1,MOVSUM
	JRST	MOVV4
MOVV04:	STATO	DDCHAN,20000
	 THUD
	TTCALL	3,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
	RETURN
MOVV5:	STATO	DDCHAN,20000
	 THUD
	TTCALL	3,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
	ENDR
-4352,4435
; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	REG1,[SIXBIT/DFTP/]
	SETNM
	HRRZI	REG1,-1
	RFMOD
	TRZ	REG2,006000	; (1B24+1B25)
	SFMOD
	MOVE	REG2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
	MOVE	REG3,[252525,,253000] ;   AND EOL'S (NO NULLS)
	SFCOC
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVE	REG1,[17,,0]	; ↑O ON CHANNEL 0
	ATI
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[1B0+1B10+1B15] ; TTY, EOF, ILI
	AIC			; ACTIVATE CHANNELS
	CALLR	ICP
	ENDR

; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:20./]
	SETZ	REG3,
	SOUT			; LOCAL SOCKET 20+JOBREL
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT			; FAILURE -- MAKE HOST # INTO STRING
	 JRST	.+1		; CVHST SUCCESS OR NOUT FAILURE
	MOVN	REG2,DCSOCK
	NOUT
	 JRST	.+1
	HRLZI	REG1,1	; SHORT GTJFN
	HRROI	REG2,UBUF1
	GTJFN			; ICP CONNECTION
	 JRST	ICPEG
	MOVE	REG2,[40B5+1B19] ; 32-BIT, READ
	OPENF			; OPEN ICP CONNECTION
	 JRST	ICPEO
	BIN
	MOVEM	REG2,ICPSOC
	CLOSF
	 JRST	ICPEC
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:22./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN			; OUTPUT JFN
	 JRST	ICPEIG
	MOVEM	REG1,DCOJFN
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN			; INPUT JFN
	 JRST	ICPEOG
	MOVEM	REG1,DCIJFN
	MOVE	REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
	OPENF
	 JRST	ICPEIO
	MOVE	REG1,DCOJFN
	MOVE	REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	ICPEOO
	MOVE	REG1,[SIXBIT/LHOSTN/]
	SYSGT
	MOVEM	REG1,LHOST
	ENDR

; NETWORK QUIT
;
QUIT:	MOVE	REG1,DCOJFN
	MOVEI	REG2,"Z"-100
	BOUT
	MOVEI	REG2,21
	MTOPR
	SETOM	FLAGEF
QUIT01:	DCBIN	<IOREG>
	SKIPE	FLAGEF
	 JRST	QUIT01
	RESET
	HALTF
	JRST	.-1		; IN CASE OF "CONTINUE"

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:24./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	SUBI	REG2,3
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN
	 JRST	NETOI2
	MOVEM	REG1,DCDJFN
	MOVE	REG2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
	OPENF
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	RLJFN
	 JRST	NETOI2
NETOI2:	HRROI	REG1,[ASCIZ / ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:25./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	SUBI	REG2,2
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN
	 JRST	NETOO2
	MOVEM	REG1,DCDJFN
	MOVE	REG2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	RLJFN
	 JRST	NETOO2
NETOO2:	HRROI	REG1,[ASCIZ / ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	MOVE	REG1,DCDJFN
	CLOSF
	 JRST	NETC1
	RETURN
NETC1:	HRROI	[ASCIZ / ?? Network connection CLOSE failure ??
/]
	PSOUT
	ENDR

; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
;   OUT: UTIL
;
NETNI:	BEGINR
	GJINF
	HRRZI	UTIL,(REG2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,24
	ENDR

; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
;   OUT: UTIL
;
NETNO:	BEGINR
	GJINF
	HRRZI	UTIL,(REG2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,25
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
NETEQ:	PSOUT
	RESET
	HALTF
	JRST	.-1
ICPEG:	HRROI	REG1,[ASCIZ / The datacomputer is unavailable (network)./]
	JRST	NETEQ
ICPEO:	HRROI	REG1,[ASCIZ / The datacomputer is unavailable (down)./]
	JRST	NETEQ
ICPEC:	HRROI	REG1,[ASCIZ / ?? ICP CLOSF failure ??/]
	JRST	NETEQ
ICPEOG:	HRROI	REG1,[ASCIZ / ?? ICP output GTJFN failure ??/]
	JRST	NETEQ
ICPEIG:	HRROI	REG1,[ASCIZ / ?? ICP input GTJFN failure ??/]
	JRST	NETEQ
ICPEIO:	HRROI	REG1,[ASCIZ / ?? ICP output OPENF failure ??/]
	JRST	NETEQ
ICPEOO:	HRROI	REG1,[ASCIZ / ?? ICP input OPENF failure ??/]
	JRST	NETEQ

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	HRLZI	REG1,100001	; OLD FILE, SHORT CALL
	MOVE	REG2,[440700,,LFILE]
	GTJFN
	 JRST	LOCOI1
	HRRZM	REG1,LJFN
	MOVE	REG2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	HRROI	REG1,[ASCIZ / (Local file not found.)
/]
	PSOUT
	RETURN
LOCOI2:	HRROI	REG1,[ASCIZ / (Local file not available.)
/]
	PSOUT
	MOVE	REG1,LJFN
	RLJFN
	 RETURN
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	HRLZI	REG1,600001	; VN, WRITE, SHORT
	MOVE	REG2,[440700,,LFILE]
	GTJFN
	 JRST	LOCOO2
	HRRZM	REG1,LJFN
	MOVE	REG2,[440000,,100000] ; 36 BIT BYTE, READ
	OPENF
	 JRST	LOCOO1
	RETURN	SKIP,1
LOCOO1:	MOVE	REG1,LJFN
	RLJFN
	 JRST	.+1
LOCOO2:	HRROI	REG1,[ASCIZ / ?? Local file creation failure ??
/]
	PSOUT
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	MOVE	REG1,LJFN
	CLOSF
	 JRST	LOCC1
	RETURN
LOCC1:	HRROI	REG1,[ASCIZ / ?? Local file CLOSE failure ??
/]
	PSOUT
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: UTIL -- SIZE IN WORDS
;
LOCS:	BEGINR
	MOVE	REG1,LJFN
	MOVE	REG2,[2,,11]	; READ 2 WORDS, OFFSET OF 11
	HRRZI	REG3,UBUF1
	GTFDB
	 JRST	.+3
	SETZ	UTIL,
	RETURN
	LDB	REG1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
	MOVEI	REG2,↑D36
	IDIVI	REG2,(REG1)	; BYTES/WD
	MOVE	REG3,UBUF1+1	; BYTE COUNT TO EOF
	ADDI	REG3,-1(REG2)	; ACCOUNT FOR TRUNCATION
	IDIVI	REG3,(REG2)	; NUMBER OF WORDS
	MOVE	UTIL,REG3
	ENDR

; LOCDG -- LOCAL FILE WRITE DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG:	BEGINR	<IOREG,UTIL>
	HRROI	REG1,GBUF1
	SETZ	REG2,
	IDTIM
	 RETURN
	MOVE	IOREG,REG2
	MOVEI	REG1,400000	; FOR THIS FORK
	RPCAP
	TRNN	REG2,600000	; (1B18+1B19) WHEEL OR OPER
	 RETURN
	MOVE	UTIL,REG3
	TRO	REG3,(REG2)
	EPCAP			; ENABLE (!)
	HRR	REG1,LJFN
	HRLI	REG1,14		; OFFSET 14 (LAST WRITE)
	SETO	REG2,
	MOVE	REG3,IOREG
	CHFDB
	 JRST	.+1
	MOVEI	REG1,400000
	MOVE	REG3,UTIL
	EPCAP			; RESET CAPABILITIES
	ENDR

; LOCDP -- LOCAL FILE WRITE DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP:	BEGINR
	MOVE	REG1,LJFN
	MOVE	REG2,[1,,14]	; 1 WORD, OFFSET 14 (LAST WRITE)
	HRRZI	REG3,GBUF1
	GTFDB
	 JRST	.+3
	SETZM	GBUF1
	RETURN
	HRROI	REG1,GBUF1
	MOVE	REG2,GBUF1
	SETZ	REG3,
	ODTIM
	ENDR

; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN:	BEGINR	<IOREG,UTIL>
	SETZM	MOVSUM
	CALLR	LOCS
	MOVEM	UTIL,MOVSPA
	MOVN	IOREG,UTIL
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVEM	REG3,MOVTIM
MOVLN1:	MOVE	REG1,LJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SIN
	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SOUT
	MOVN	UTIL,IOREG
	CAILE	UTIL,SIZPAG
	 MOVEI	UTIL,SIZPAG
	SETZ	REG1,
	ADD	REG1,<PAGE-1>(UTIL)
	SOJG	UTIL,.-1
	ADDM	REG1,MOVSUM
	ADDI	IOREG,SIZPAG
	JUMPL	IOREG,MOVLN1
	MOVE	REG1,DCDJFN
	MOVEI	REG2,21
	MTOPR
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVE	REG2,MOVTIM
	SUB	REG3,REG2
	MOVEM	REG3,MOVTIM
	ENDR

; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL:	BEGINR	<UTIL>
	SETOM	FLAGEF
	SETZM	MOVSUM
	SETZM	MOVSPA
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVEM	REG3,MOVTIM
MOVNL1:	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	SIN
	MOVE	REG1,LJFN
	MOVE	REG2,[444400,,PAGE]
	ADDI	REG3,SIZPAG	; WORDS RECEIVED
	JUMPE	REG3,MOVNL2
	MOVEI	UTIL,(REG3)
	MOVNI	REG3,(REG3)
	SOUT
	ADDM	UTIL,MOVSPA
	SETZ	REG1,
	ADD	REG1,<PAGE-1>(UTIL)
	SOJG	UTIL,.-1
	ADDM	REG1,MOVSUM
MOVNL2:	SKIPE	FLAGEF
	 JRST	MOVNL1
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVE	REG2,MOVTIM
	SUB	REG3,REG2
	MOVEM	REG3,MOVTIM
	ENDR

; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	UTIL,
	SETZ	FLAG,
	SETOM	FLAGEF
	SETZM	MOVSUM
MOVV1:	CAIN	FLAG,0
	 ADDI	UTIL,1
	MOVE	REG1,LJFN
	BIN
	SKIPN	FLAGEF
	 JRST	MOVV2
	MOVE	IOREG,REG2
	MOVE	REG1,DCDJFN
	BIN
	SKIPN	FLAGEF
	 JRST	MOVV5
	ADDM	REG2,MOVSUM
	CAMN	IOREG,REG2
	 JRST	MOVV1
	AOJA	FLAG,MOVV1
MOVV2:	SETOM	FLAGEF
	MOVE	REG1,DCDJFN
	BIN
	SKIPE	FLAGEF
	 JRST	MOVV4
	JUMPN	FLAG,MOVV3
	HRROI	REG1,[ASCIZ / [OK]
/]
	PSOUT
	RETURN
MOVV3:	CAIE	FLAG,1
	 JRST	.+4
	HRROI	REG1,[ASCIZ / (There is one different word at /]
	PSOUT
	JRST	MOVV03
	HRROI	REG1,[ASCIZ / (There are /]
	PSOUT
	TNOUT	<FLAG>
	HRROI	REG1,[ASCIZ / different words, with the first difference at /]
	PSOUT
MOVV03:	TNOUT	<UTIL>
	HRROI	REG1,[ASCIZ /.)
/]
	PSOUT
	RETURN
MOVV4:	ADDM	REG2,MOVSUM
	BIN
	SKIPE	FLAGEF
	 JRST	MOVV4
	HRROI	REG1,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
	PSOUT
	RETURN
MOVV5:	HRROI	REG1,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
	PSOUT
	ENDR

; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI:	SETOM	FLAGCO
	DEBRK
EOFPSI:	SKIPN	FLAGEF
	 JRST	EOFPSE
	SETZM	FLAGEF
	DEBRK			; RETURN FROM INTERRUPT
EOFPSE:	HRROI	REG1,[ASCIZ / ?? Unexpected EOF at /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ / ??
/]
	PSOUT
	HALTF
	JRST	.-1
ILIPSI:	HRRZ	REG1,PSIPC1
	MOVE	REG2,-1(REG1)
	CAMN	REG2,[GTFDB]
	 JRST	ILIPSD
	CAMN	REG2,[CHFDB]
	 JRST	ILIPSD
	HRROI	REG1,[ASCIZ / ?? Illegal instruction at /]
	CAMN	REG2,[-1]
	 HRROI	REG1,[ASCIZ / ?? Impossible event at /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ / ??
/]
	PSOUT
	HALTF
	JRST	.-1
ILIPSD:	HRROI	REG1,[ASCIZ / (Bad local device.)
/]
	PSOUT
	AOS	PSIPC1
	DEBRK		; RETURN FROM INTERRUPT
-4436:>
-4439,4465
; ***DATA***

CRLF:	BYTE	(7)15,12,0,0,0
SEMI:	BYTE	(7)73,15,12,0,0

HOSTS:	11,,[ASCIZ /HARVARD/]
	13,,[ASCIZ /ITS/]		; SAIL
	37,,[ASCIZ /CCA/]
	53,,[ASCIZ /OFFICE"-1/]
	55,,[ASCIZ /SCI/]
	56,,[ASCIZ /RUTGERS/]
	61,,[ASCIZ /BBN/]		; TENEXB
	70,,[ASCIZ /SUMEX/]
	102,,[ASCIZ /AIC/]
	106,,[ASCIZ /ITS/]		; DMS
	126,,[ASCIZ /ISI/]		; ISI
	162,,[ASCIZ /BBN/]		; TENEXD
	206,,[ASCIZ /ITS/]		; AI
	226,,[ASCIZ /ISI/]		; ISIC
	305,,[ASCIZ /BBN/]		; TENEXA
	306,,[ASCIZ /ITS/]		; ML
	326,,[ASCIZ /ISI/]		; ISID
	354,,[ASCIZ /ITS/]		; MC
	361,,[ASCIZ /BBN/]		; TENEXC
	364,,[ASCIZ /ISI/]		; ISIB
	0

	LIT			; LITERALS GO HERE

; (((ITS)))
IFL F.TENX,<
IOBUFR:	BLOCK 2000
LCLDEV:	BLOCK 1			; local device
LCLFN1:	BLOCK 1
LCLFN2:	BLOCK 1
LCLSNM:	BLOCK 1			; SNAME
RCHBLK:	BLOCK 10		; network status goes here
LCLRCV:	BLOCK 1
LCLTRN:	BLOCK 1
FORRCV:	BLOCK 1
FORTRN:	BLOCK 1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
	RELOC	0

IFE F.SAIL,<
ICPBLK:	SIXBIT	/IMP/
	0
	100			; LOCAL SOCKET
	40,,DCHOST		; 32 BIT BYTES (ICP), CCA HOST
	DCSOKT			; DATACOMPUTER SOCKET
DCIBLK:	SIXBIT	/IMP/
	0
	102			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP + 1
DCOBLK:	SIXBIT	/IMP/
	0
	103			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP
DCDBLK:	SIXBIT	/IMP/
	0
	0			; LOCAL SOCKET (104 RECEIVE, 105 SEND)
	44,,DCHOST		; 36 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP +2 OR +3
WRKBLK:	BLOCK	5
ICCHAS:	10			; IMAGE MODE
	SIXBIT	/IMP/
	0,,ICPBUF
ICPBUF:	BLOCK	3
DCCHAS:	0			; 7 BIT ASCII MODE
	SIXBIT	/IMP/
	DCOBUF,,DCIBUF
>
DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF

DDIBUF:	BLOCK	3
DDOBUF:	BLOCK	3

; (((SAIL)))
IFN F.SAIL,<
CONECB:	BLOCK 7

; OTHER RANDOM THINGS

TERBLK:	3			; TERMINATE BLOCK
	0			; STATUS BITS
	1			; FOREIGN SOCKET LOC
	0			; DON'T WAIT

STTBLK:	2
	BLOCK 2
-4468
LFILE:	0			; LOCAL FILE NAME
	0			; EXTENSION
	0			; PROTECTION AND CREATION DATE
	0			; PROJ-PROG - 0 IS SELF
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF
LFIBUF:	BLOCK	3
LFOBUF:	BLOCK	3

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK	3
LUTDSP:	0
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
LEVTAB:	PSIPC1
	PSIPC2
	PSIPC3
PSIPC1:	BLOCK	1
PSIPC2:	BLOCK	1
PSIPC3:	BLOCK	1
CHNTAB:	1,,TCOPSI
	REPEAT 9,<EXP 0>
	1,,EOFPSI
	REPEAT 4,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGCO:	0
FLAGEF:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
DCDJFN:	0			; DC DATA JFN

LFILE:	BLOCK	SBUFS
LJFN:	0

PAGE:	BLOCK	SIZPAG
>
; (((↑↑↑)))

-4480,4480
FLAGTT:	-1
-4505,4505
	-1			; cretinous LINK-10 bug